﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "IGraphicsCurve3d.h"
#include "Intervald.h"

namespace gcmp
{
    class ILine3d;

    /// \brief 直线图形节点
    GCMP_DEPRECATED_CLASS(2023/11/01) class GCMP_GRAPHICS_NODE_INTERFACE_EXPORT IGraphicsLine : public IGraphicsCurve3d
    {
        DEFINE_CAST_DERIVED(IGraphicsLine, IGraphicsCurve3d)

    public:
        /// \brief 析构器
        virtual ~IGraphicsLine();

    public:
        /// \brief 给节点设置标签
        /// \param tag 设置在节点上的标签
        GCMP_DEPRECATED_API(2023/11/01) virtual void SetTag(const Guid& tag) = 0;

        /// \brief 获取直线的原点
        /// \return 直线的原点
        GCMP_DEPRECATED_API(2023/11/01) virtual Vector3d GetOrigin() const = 0;

        /// \brief 获取直线的方向
        /// \return 直线的方向
        GCMP_DEPRECATED_API(2023/11/01) virtual Vector3d GetDirection() const = 0;

        /// \brief 设置起点和终点
        /// \param startPoint  起点
        /// \param endPoint    终点
        /// \return true-设置成功；false-设置失败
        GCMP_DEPRECATED_API(2023/11/01) virtual bool Set(const Vector3d& startPoint, const Vector3d& endPoint) = 0;

        /// \brief 设置起点
        /// \param startPoint 起点
        /// \return true-设置成功；false-设置失败
        GCMP_DEPRECATED_API(2023/11/01) virtual bool SetStartPoint(const Vector3d& startPoint) = 0;

        /// \brief 设置终点
        /// \param endPoint 终点
        /// \return true-设置成功；false-设置失败
        GCMP_DEPRECATED_API(2023/11/01) virtual bool SetEndPoint(const Vector3d& endPoint) = 0;

        /// \brief 通过给定的一点，获得直线上最近点
        /// \param givenPoint 给定的一点
        /// \return 直线上最近点
        GCMP_DEPRECATED_API(2023/11/01) virtual Vector3d GetClosestPointTo(const Vector3d& givenPoint) const = 0;

        /// \brief 判断在给定容差范围内，点是否在直线上
        /// \param point    点
        /// \param distantTollerance  容差范围
        /// \return 若在直线上，返回true；否则返回false
        GCMP_DEPRECATED_API(2023/11/01) virtual bool IsPointOnLine(const Vector3d& point, double distantTollerance) const = 0;

        /// \brief 判断是否与给定直线在平行
        /// \param line 给定直线
        /// \return true-是；false-否
        GCMP_DEPRECATED_API(2023/11/01) virtual bool IsParallel(const IGraphicsLine& line) const = 0;

        /// \brief 延伸直线
        /// \param backward 反向延长参数(非长度)
        /// \param forward  正向延长参数(非长度)
        /// \return true-设置成功；false-设置失败
        GCMP_DEPRECATED_API(2023/11/01) virtual bool Extend(double backward, double forward) = 0;

        /// \brief 求点在该无限长直线上的投影点
        /// \param givenPoint     给定的点
        /// \param parameter        投影点的参数
        /// \param minDistant       给定的点和投影点之间的距离
        /// \param projectPoint    直线上的投影点
        /// \return 无
        GCMP_DEPRECATED_API(2023/11/01) virtual void ProjectPoint(const Vector3d& givenPoint, double& parameter, double& minDistant, Vector3d& projectPoint) const = 0;

        /// \brief 获取直线的参数区间
        /// \return 参数区间
        GCMP_DEPRECATED_API(2023/11/01) virtual Intervald GetLimits() const = 0;

        /// \brief 设置直线的参数区间
        /// \param interval 直线的参数区间
        /// \return 无
        GCMP_DEPRECATED_API(2023/11/01) virtual void SetLimits(const Intervald& interval) = 0;

        /// \brief 设置直线的原点
        /// \param origin 直线的原点
        /// \return 无
        GCMP_DEPRECATED_API(2023/11/01) virtual void SetOrigin(const Vector3d& origin) = 0;

        /// \brief 设置直线的方向
        /// \param direction 直线的方向
        /// \return 无
        GCMP_DEPRECATED_API(2023/11/01) virtual void SetDirection(const Vector3d& direction) = 0;

        /// \brief 获取直线
        /// \return 直线
        GCMP_DEPRECATED_API(2023/11/01) virtual const ILine3d* GetGmILine3d()const = 0;

        /// \brief 获取直线
        /// \return 直线
        GCMP_DEPRECATED_API(2023/11/01) virtual ILine3d* GetGmILine3dFW() = 0;

    public:
        /// \brief 创建默认的直线图形节点
        /// \return 直线图形节点
        GCMP_DEPRECATED_API(2023/11/01) static OwnerPtr<IGraphicsLine> Create();

        /// \brief 通过直线，来创建一个直线图形节点
        /// \param opILine3d 直线
        /// \return 直线图形节点
        GCMP_DEPRECATED_API(2023/11/01) static OwnerPtr<IGraphicsLine> Create(OwnerPtr<ILine3d> opILine3d);

        /// \brief 通过两点，来创建一个直线图形节点
        /// \param startPoint  直线起点
        /// \param endPoint    直线终点
        /// \return 直线图形节点
        GCMP_DEPRECATED_API(2023/11/01) static OwnerPtr<IGraphicsLine> Create(const Vector3d& startPoint, const Vector3d& endPoint);

        /// \brief 通过中的一点，方向，区间，来创建一个直线图形节点
        /// \param origin       直线原点
        /// \param direction    直线方向
        /// \param interval     直线区间
        /// \return 直线图形节点
        GCMP_DEPRECATED_API(2023/11/01) static OwnerPtr<IGraphicsLine> CreateByParametric(const Vector3d& origin, const Vector3d& direction, const Intervald& interval);
    };
}


